<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Joyce (programming language)</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Joyce_(programming_language)"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.pygments.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Joyce_programming_language rootpage-Joyce_programming_language skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Joyce (programming language)</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p class="mw-empty-elt">
</p>
<style data-mw-deduplicate="TemplateStyles:r1305433154">
/* start https://en.wikipedia.org/ */
.mw-parser-output .ambox{border:1px solid #a2a9b1;border-left:10px solid #36c;background-color:#fbfbfb;box-sizing:border-box}.mw-parser-output .ambox+link+.ambox,.mw-parser-output .ambox+link+style+.ambox,.mw-parser-output .ambox+link+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+style+.ambox,.mw-parser-output .ambox+.mw-empty-elt+link+link+.ambox{margin-top:-1px}html body.mediawiki .mw-parser-output .ambox.mbox-small-left{margin:4px 1em 4px 0;overflow:hidden;width:238px;border-collapse:collapse;font-size:88%;line-height:1.25em}.mw-parser-output .ambox-speedy{border-left:10px solid #b32424;background-color:#fee7e6}.mw-parser-output .ambox-delete{border-left:10px solid #b32424}.mw-parser-output .ambox-content{border-left:10px solid #f28500}.mw-parser-output .ambox-style{border-left:10px solid #fc3}.mw-parser-output .ambox-move{border-left:10px solid #9932cc}.mw-parser-output .ambox-protection{border-left:10px solid #a2a9b1}.mw-parser-output .ambox .mbox-text{border:none;padding:0.25em 0.5em;width:100%}.mw-parser-output .ambox .mbox-image{border:none;padding:2px 0 2px 0.5em;text-align:center}.mw-parser-output .ambox .mbox-imageright{border:none;padding:2px 0.5em 2px 0;text-align:center}.mw-parser-output .ambox .mbox-empty-cell{border:none;padding:0;width:1px}.mw-parser-output .ambox .mbox-image-div{width:52px}@media(min-width:720px){.mw-parser-output .ambox{margin:0 10%}}@media print{body.ns-0 .mw-parser-output .ambox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1248332772">
/* start https://en.wikipedia.org/ */
.mw-parser-output .multiple-issues-text{width:95%;margin:0.2em 0}.mw-parser-output .multiple-issues-text>.mw-collapsible-content{margin-top:0.3em}.mw-parser-output .compact-ambox .ambox{border:none;border-collapse:collapse;background-color:transparent;margin:0 0 0 1.6em!important;padding:0!important;width:auto;display:block}body.mediawiki .mw-parser-output .compact-ambox .ambox.mbox-small-left{font-size:100%;width:auto;margin:0}.mw-parser-output .compact-ambox .ambox .mbox-text{padding:0!important;margin:0!important}.mw-parser-output .compact-ambox .ambox .mbox-text-span{display:list-item;line-height:1.5em;list-style-type:disc}body.skin-minerva .mw-parser-output .multiple-issues-text>.mw-collapsible-toggle,.mw-parser-output .compact-ambox .ambox .mbox-image,.mw-parser-output .compact-ambox .ambox .mbox-imageright,.mw-parser-output .compact-ambox .ambox .mbox-empty-cell,.mw-parser-output .compact-ambox .hide-when-compact{display:none}
/* end https://en.wikipedia.org/ */
</style>
<style data-mw-deduplicate="TemplateStyles:r1295905060">
/* start https://en.wikipedia.org/ */
.mw-parser-output .infobox-subbox{padding:0;border:none;margin:-3px;width:auto;min-width:100%;font-size:100%;clear:none;float:none;background-color:transparent}.mw-parser-output .infobox-3cols-child{margin:auto}.mw-parser-output .infobox .navbar{font-size:100%}@media screen{html.skin-theme-clientpref-night .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .infobox-full-data:not(.notheme)>div:not(.notheme)[style]{background:#1f1f23!important;color:#f8f9fa}}@media(min-width:640px){body.skin--responsive .mw-parser-output .infobox-table{display:table!important}body.skin--responsive .mw-parser-output .infobox-table>caption{display:table-caption!important}body.skin--responsive .mw-parser-output .infobox-table>tbody{display:table-row-group}body.skin--responsive .mw-parser-output .infobox-table th,body.skin--responsive .mw-parser-output .infobox-table td{padding-left:inherit;padding-right:inherit}}
/* end https://en.wikipedia.org/ */
</style><table class="infobox vevent"><tbody><tr><th colspan="2" class="infobox-above" style="background-color:#e0e0e0;">Joyce</th></tr><tr><th scope="row" class="infobox-label"><a href="Programming_paradigm" title="Programming paradigm">Paradigm</a></th><td class="infobox-data"><a href="Concurrent_programming_language" class="mw-redirect" title="Concurrent programming language">concurrent</a>, <a href="Imperative_programming" title="Imperative programming">imperative</a>, <a href="Structured_programming" title="Structured programming">structured</a></td></tr><tr><th scope="row" class="infobox-label">Family</th><td class="infobox-data"><a href="Niklaus_Wirth" title="Niklaus Wirth">Wirth</a> <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a></td></tr><tr><th scope="row" class="infobox-label"><a href="Software_design" title="Software design">Designed by</a></th><td class="infobox-data"><a href="Per_Brinch_Hansen" title="Per Brinch Hansen">Per Brinch Hansen</a></td></tr><tr><th scope="row" class="infobox-label">First appeared</th><td class="infobox-data">1987<span style="display:none"> (<span class="bday dtstart published updated">1987</span>)</span></td></tr><tr><td colspan="2" class="infobox-full-data"></td></tr><tr><th scope="row" class="infobox-label" style="white-space: nowrap;"><a href="Software_release_life_cycle" title="Software release life cycle">Stable release</a></th><td class="infobox-data"><div style="margin:0px;">1
/ 1987<span style="display:none"> (<span class="bday dtstart published updated">1987</span>)</span></div></td></tr><tr style="display:none"><td colspan="2">
</td></tr><tr><th scope="row" class="infobox-label"><a href="Type_system" title="Type system">Typing discipline</a></th><td class="infobox-data"><a href="Strong_and_weak_typing" title="Strong and weak typing">Strong</a></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #EEEEEE;">Influenced by</th></tr><tr><td colspan="2" class="infobox-full-data"><a href="Communicating_sequential_processes" title="Communicating sequential processes">Communicating sequential processes</a>, <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a>, <a href="Concurrent_Pascal" title="Concurrent Pascal">Concurrent Pascal</a></td></tr><tr><th colspan="2" class="infobox-header" style="background-color: #EEEEEE;">Influenced</th></tr><tr><td colspan="2" class="infobox-full-data"><a href="SuperPascal" title="SuperPascal">SuperPascal</a></td></tr></tbody></table>
<p><b>Joyce</b> is a secure <a href="Programming_language" title="Programming language">programming language</a> for <a href="Concurrent_computing" title="Concurrent computing">concurrent computing</a> designed by <a href="Per_Brinch_Hansen" title="Per Brinch Hansen">Per Brinch Hansen</a> in the 1980s.<sup id="cite_ref-Hansen1987_1-0" class="reference"><a href="#cite_note-Hansen1987-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> It is based on the sequential language <a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a> and the principles of <a href="Communicating_sequential_processes" title="Communicating sequential processes">communicating sequential processes</a> (CSP). It was created to address the shortcomings of CSP to be applied as a programming language, and to provide a tool, mainly for teaching, for <a href="Distributed_computing" title="Distributed computing">distributed computing</a> system implementation.
</p><p>The language is based around the concept of <i>agents</i>; concurrently executed processes that communicate only by the use of channels and <a href="Message_passing" title="Message passing">message passing</a>. Agents may activate subagents dynamically and <a href="Recursion_(computer_science)" title="Recursion (computer science)">recursively</a>. The development of Joyce formed the foundation of the language <a href="SuperPascal" title="SuperPascal">SuperPascal</a>, also developed by Hansen around 1993.
</p>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Features">Features</h2></div>
<p>Joyce is based on a small subset of Pascal, extended with features inspired from CSP for concurrency.<sup id="cite_ref-Hansen1989a_2-0" class="reference"><a href="#cite_note-Hansen1989a-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> The following sections describe some of the more novel features that were introduced.
</p>
<div class="mw-heading mw-heading3"><h3 id="Agents">Agents</h3></div>
<p>An agent is a procedure consisting of a set of statements and possibly nested definitions of other agents. An agent may dynamically <i>activate</i> subagents which execute concurrently with their <i>creator</i>. An agent can terminate only when all of its subagents have also terminated. For example, an agent <code>process2</code> activates <code>process1</code>:
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr mw-highlight-lines" dir="ltr"><pre><span class="hll"><span class="n">agent</span><span class="w"> </span><span class="n">process1</span><span class="p">(</span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">y</span><span class="o">:</span><span class="w"> </span><span class="kt">integer</span><span class="p">)</span><span class="o">;</span>
</span><span class="k">begin</span>
<span class="w"> </span><span class="o">...</span>
<span class="k">end</span><span class="o">;</span>
<span class="hll"><span class="n">agent</span><span class="w"> </span><span class="n">process2</span><span class="p">()</span><span class="o">;</span>
</span><span class="n">use</span><span class="w"> </span><span class="n">process1</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">process1</span><span class="p">(</span><span class="mi">9</span><span class="o">,</span><span class="w"> </span><span class="mi">17</span><span class="p">)</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>
</pre></div>
<p>The activation of an agent creates new instances of all <a href="Local_variable" title="Local variable">local variables</a> and the value of each formal parameter is copied to a local variable. Hence, agents cannot access <a href="Variable_(computer_science)" title="Variable (computer science)">variables</a> of other agents and are allowed only to communicate through the use of channels. This restriction prevents problems associated with the use of shared variables such as <a href="Race_condition" title="Race condition">race conditions</a>.
</p>
<div class="mw-heading mw-heading3"><h3 id="Communication">Communication</h3></div>
<p>Agents communicate through entities called <i>channels</i>. Channels have an alphabet, defining the set of symbols which may be transmitted. Channels are created dynamically and accessed through the use of <i>port</i> variables. A port type is defined by a distinct set of symbols constituting its alphabet. Symbols with multiple values are defined with a specific type. For example:
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span class="n">stream</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="kt">integer</span><span class="p">)</span><span class="o">,</span><span class="w"> </span><span class="n">eos</span><span class="p">]</span><span class="o">;</span>
</pre></div>
<p>The symbol <code>int(integer)</code> denotes a <i>message</i> symbol called <code>int</code> of any integer value. The second typeless symbol declaration <code>eos</code> (end of stream) is named a <i>signal</i>. Once a port type has been defined, a port variable of that type can be declared:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre>out : stream
in : stream
</pre></div>
<p>And then a channel entity, internal to the agent creating it, can be activated as follows:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre>+out;
</pre></div>
<p>Symbols can then be sent and received on channels using the CSP-style input and output operators <code>?</code> and <code>!</code> respectively. A communication can occur only if there is a receiving agent matching the sending agent. The receiving agent must expect to receive the symbol type being sent. For example, the value 9 followed by the <code>eos</code> symbol is sent on port <code>out</code>:
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span class="n">out</span><span class="w"> </span><span class="err">!</span><span class="w"> </span><span class="nb">int</span><span class="p">(</span><span class="mi">9</span><span class="p">)</span>
<span class="n">out</span><span class="w"> </span><span class="err">!</span><span class="w"> </span><span class="n">eos</span>
</pre></div>
<p>And an integer message is received into a variable of a matching type, followed by the <code>eos</code>:
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span class="n">received</span><span class="w"> </span><span class="o">:</span><span class="w"> </span><span class="kt">integer</span>
<span class="k">in</span><span class="w"> </span><span class="err">?</span><span class="w"> </span><span class="nb">int</span><span class="p">(</span><span class="n">received</span><span class="p">)</span>
<span class="k">in</span><span class="w"> </span><span class="err">?</span><span class="w"> </span><span class="n">eos</span>
</pre></div>
<div class="mw-heading mw-heading3"><h3 id="Polling_statements">Polling statements</h3></div>
<p>Polling statements are based the CSP concept of guarded alternatives. A polling statement is made up of a set of statements, each guarded by an input channel statement. When a communication is matched between a transmitting agent and a guard, the guard is executed, followed by the corresponding statement. For example:
</p>
<div class="mw-highlight mw-highlight-lang-text mw-content-ltr" dir="ltr"><pre>poll
in ? X -> x := x + 1 |
in ? Y -> y := y + 1
end
</pre></div>
<p>Where the port <code>in</code> is monitored for the signals <code>X</code> or <code>Y</code>, on a matching communication, the corresponding variables <code>x</code> or <code>y</code> are incremented.
</p>
<div class="mw-heading mw-heading3"><h3 id="Security">Security</h3></div>
<p>Joyce was designed to be a <i>secure</i> language in the sense that a compiler would be able to detect all violations of the language rules.
</p>
<div class="mw-heading mw-heading2"><h2 id="Example_program">Example program</h2></div>
<p>The following is a complete example program, taken from the original paper introducing the Joyce programming language,<sup id="cite_ref-Hansen1987_1-1" class="reference"><a href="#cite_note-Hansen1987-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> implementing an algorithm to generate prime numbers based on a sieving technique for <a href="Generation_of_primes" title="Generation of primes">generation of primes</a>. A <code>sieve</code> agent is sent a stream of integers from its predecessor, the first being a prime. It removes all multiples of this prime from the stream and activates a successor. This continues until the <code>eos</code> signal is propagated along the set of sieves.
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span class="hll"><span class="n">agent</span><span class="w"> </span><span class="n">sieve</span><span class="p">(</span><span class="n">inp</span><span class="o">,</span><span class="w"> </span><span class="n">out</span><span class="o">:</span><span class="w"> </span><span class="n">stream</span><span class="p">)</span><span class="o">;</span>
</span><span class="k">var</span><span class="w"> </span><span class="n">more</span><span class="o">:</span><span class="w"> </span><span class="kt">boolean</span><span class="o">;</span><span class="w"> </span><span class="n">x</span><span class="o">,</span><span class="w"> </span><span class="n">y</span><span class="o">:</span><span class="w"> </span><span class="kt">integer</span><span class="o">;</span>
<span class="w"> </span><span class="nb">succ</span><span class="o">:</span><span class="w"> </span><span class="n">stream</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="n">poll</span>
<span class="w"> </span><span class="n">inp</span><span class="err">?</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="o">+</span><span class="nb">succ</span><span class="o">;</span><span class="w"> </span>
<span class="w"> </span><span class="n">sieve</span><span class="p">(</span><span class="nb">succ</span><span class="o">,</span><span class="w"> </span><span class="n">out</span><span class="p">)</span><span class="o">;</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">true</span><span class="w"> </span><span class="err">|</span>
<span class="w"> </span><span class="n">inp</span><span class="err">?</span><span class="n">eos</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">out</span><span class="err">!</span><span class="n">eos</span><span class="o">;</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">false</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>
<span class="w"> </span><span class="k">while</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="k">do</span>
<span class="w"> </span><span class="n">poll</span>
<span class="w"> </span><span class="n">inp</span><span class="err">?</span><span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="o">-></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">y</span><span class="w"> </span><span class="k">mod</span><span class="w"> </span><span class="n">x</span><span class="w"> </span><span class="o"><></span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="nb">succ</span><span class="err">!</span><span class="nb">int</span><span class="p">(</span><span class="n">y</span><span class="p">)</span><span class="w"> </span><span class="err">|</span>
<span class="w"> </span><span class="n">inp</span><span class="err">?</span><span class="n">eos</span><span class="w"> </span><span class="o">-></span><span class="w"> </span><span class="n">out</span><span class="err">!</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="nb">succ</span><span class="err">!</span><span class="n">eos</span><span class="o">;</span><span class="w"> </span><span class="n">more</span><span class="w"> </span><span class="o">:=</span><span class="w"> </span><span class="k">false</span>
<span class="w"> </span><span class="k">end</span><span class="o">;</span>
<span class="k">end</span><span class="o">;</span>
</pre></div>
<p>The following agent initialises the set of sieve agents and inputs into them a stream of integers between 3 and 9999.
</p>
<div class="mw-highlight mw-highlight-lang-pascal mw-content-ltr" dir="ltr"><pre><span class="hll"><span class="n">agent</span><span class="w"> </span><span class="n">primes</span><span class="o">;</span>
</span><span class="n">use</span><span class="w"> </span><span class="n">generate</span><span class="o">,</span><span class="w"> </span><span class="n">sieve</span><span class="o">,</span><span class="w"> </span><span class="n">print</span><span class="o">;</span>
<span class="k">var</span><span class="w"> </span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="o">:</span><span class="w"> </span><span class="n">stream</span><span class="o">;</span>
<span class="k">begin</span>
<span class="w"> </span><span class="o">+</span><span class="n">a</span><span class="o">;</span><span class="w"> </span><span class="o">+</span><span class="n">b</span><span class="o">;</span><span class="w"> </span><span class="n">generate</span><span class="p">(</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="mi">3</span><span class="o">,</span><span class="w"> </span><span class="mi">2</span><span class="o">,</span><span class="w"> </span><span class="mi">4999</span><span class="p">)</span><span class="o">;</span>
<span class="w"> </span><span class="n">sieve</span><span class="p">(</span><span class="n">a</span><span class="o">,</span><span class="w"> </span><span class="n">b</span><span class="p">)</span><span class="o">;</span><span class="w"> </span><span class="n">print</span><span class="p">(</span><span class="n">b</span><span class="p">)</span>
<span class="k">end</span><span class="o">;</span>
</pre></div>
<div class="mw-heading mw-heading2"><h2 id="Implementation">Implementation</h2></div>
<div class="mw-heading mw-heading3"><h3 id="Stack_allocation">Stack allocation</h3></div>
<p>Due to concurrent execution of agent procedures, a conventional sequential <a href="Stack_(abstract_data_type)" title="Stack (abstract data type)">stack</a> allocation scheme cannot be used as the activation records of the agent calls do not follow a last-in first-out pattern. Instead, the creator-subagent relationships form a tree-structured stack. A simple scheme is used to implement this behaviour, which works by allocating new activation records at the top of the stack, and linking subagents' activation records to their creator's record. These records are freed only when the agent has terminated and they are at the top of the stack.<sup id="cite_ref-Hansen1989b_3-0" class="reference"><a href="#cite_note-Hansen1989b-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> The effectiveness of this scheme depends on the structure and behaviour of a program, which in some cases will result in poor memory use. A more effective scheme was implemented in Hansen's language <a href="SuperPascal" title="SuperPascal">SuperPascal</a>.
</p>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */
.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}
/* end https://en.wikipedia.org/ */
</style><div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-Hansen1987-1"><span class="mw-cite-backlink">^ <a href="#cite_ref-Hansen1987_1-0"><sup><i><b>a</b></i></sup></a> <a href="#cite_ref-Hansen1987_1-1"><sup><i><b>b</b></i></sup></a></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */
.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}
/* end https://en.wikipedia.org/ */
</style><cite id="CITEREFHansen2002" class="citation book cs1"><a href="Per_Brinch_Hansen" title="Per Brinch Hansen">Hansen, Brinch</a> (2002). "Joyce: A programming language for distributed systems". In Hansen, Per Brinch (ed.). <i>The Origin of Concurrent Programming: From Semaphores to Remote Procedure Calls</i>. New York, New York: Springer. pp. <span class="nowrap">464โ</span>492. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1007%2F978-1-4757-3472-0">10.1007/978-1-4757-3472-0</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a> <bdi>978-1-4419-2986-0</bdi>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:44909506">44909506</a>.</cite></span>
</li>
<li id="cite_note-Hansen1989a-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-Hansen1989a_2-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHansen1989" class="citation journal cs1"><a href="Per_Brinch_Hansen" title="Per Brinch Hansen">Hansen, Brinch</a> (June 1989). <span class="id-lock-subscription" title="Paid subscription required"><a rel="nofollow" class="external text" href="https://surface.syr.edu/eecs_techreports/29">"The Joyce language report"</a></span>. <i>Software: Practice and Experience</i>. <b>19</b> (6). John Wiley & Sons: <span class="nowrap">553โ</span>578. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1002%2Fspe.4380190606">10.1002/spe.4380190606</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:30474491">30474491</a>.</cite></span>
</li>
<li id="cite_note-Hansen1989b-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-Hansen1989b_3-0">^</a></b></span> <span class="reference-text"><cite id="CITEREFHansen1989" class="citation journal cs1"><a href="Per_Brinch_Hansen" title="Per Brinch Hansen">Hansen, Brinch</a> (June 1989). <span class="id-lock-subscription" title="Paid subscription required"><a rel="nofollow" class="external text" href="https://surface.syr.edu/eecs_techreports/29">"A multiprocessor implementation of Joyce"</a></span>. <i>Software: Practice and Experience</i>. <b>19</b> (6). John Wiley & Sons: <span class="nowrap">579โ</span>592. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1002%2Fspe.4380190606">10.1002/spe.4380190606</a>. <a href="S2CID_(identifier)" class="mw-redirect" title="S2CID (identifier)">S2CID</a> <a rel="nofollow" class="external text" href="https://api.semanticscholar.org/CorpusID:30474491">30474491</a>.</cite></span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li><span class="official-website"><span class="url"><a rel="nofollow" class="external text" href="http://brinch-hansen.net">Official website</a></span></span>, Brinch Hansen Archive, a set of his papers</li></ul>
<div class="navbox-styles"><style data-mw-deduplicate="TemplateStyles:r1129693374">
/* start https://en.wikipedia.org/ */
.mw-parser-output .hlist dl,.mw-parser-output .hlist ol,.mw-parser-output .hlist ul{margin:0;padding:0}.mw-parser-output .hlist dd,.mw-parser-output .hlist dt,.mw-parser-output .hlist li{margin:0;display:inline}.mw-parser-output .hlist.inline,.mw-parser-output .hlist.inline dl,.mw-parser-output .hlist.inline ol,.mw-parser-output .hlist.inline ul,.mw-parser-output .hlist dl dl,.mw-parser-output .hlist dl ol,.mw-parser-output .hlist dl ul,.mw-parser-output .hlist ol dl,.mw-parser-output .hlist ol ol,.mw-parser-output .hlist ol ul,.mw-parser-output .hlist ul dl,.mw-parser-output .hlist ul ol,.mw-parser-output .hlist ul ul{display:inline}.mw-parser-output .hlist .mw-empty-li{display:none}.mw-parser-output .hlist dt::after{content:": "}.mw-parser-output .hlist dd::after,.mw-parser-output .hlist li::after{content:" ยท ";font-weight:bold}.mw-parser-output .hlist dd:last-child::after,.mw-parser-output .hlist dt:last-child::after,.mw-parser-output .hlist li:last-child::after{content:none}.mw-parser-output .hlist dd dd:first-child::before,.mw-parser-output .hlist dd dt:first-child::before,.mw-parser-output .hlist dd li:first-child::before,.mw-parser-output .hlist dt dd:first-child::before,.mw-parser-output .hlist dt dt:first-child::before,.mw-parser-output .hlist dt li:first-child::before,.mw-parser-output .hlist li dd:first-child::before,.mw-parser-output .hlist li dt:first-child::before,.mw-parser-output .hlist li li:first-child::before{content:" (";font-weight:normal}.mw-parser-output .hlist dd dd:last-child::after,.mw-parser-output .hlist dd dt:last-child::after,.mw-parser-output .hlist dd li:last-child::after,.mw-parser-output .hlist dt dd:last-child::after,.mw-parser-output .hlist dt dt:last-child::after,.mw-parser-output .hlist dt li:last-child::after,.mw-parser-output .hlist li dd:last-child::after,.mw-parser-output .hlist li dt:last-child::after,.mw-parser-output .hlist li li:last-child::after{content:")";font-weight:normal}.mw-parser-output .hlist ol{counter-reset:listitem}.mw-parser-output .hlist ol>li{counter-increment:listitem}.mw-parser-output .hlist ol>li::before{content:" "counter(listitem)"\a0 "}.mw-parser-output .hlist dd ol>li:first-child::before,.mw-parser-output .hlist dt ol>li:first-child::before,.mw-parser-output .hlist li ol>li:first-child::before{content:" ("counter(listitem)"\a0 "}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r1236075235">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbox{box-sizing:border-box;border:1px solid #a2a9b1;width:100%;clear:both;font-size:88%;text-align:center;padding:1px;margin:1em auto 0}.mw-parser-output .navbox .navbox{margin-top:0}.mw-parser-output .navbox+.navbox,.mw-parser-output .navbox+.navbox-styles+.navbox{margin-top:-1px}.mw-parser-output .navbox-inner,.mw-parser-output .navbox-subgroup{width:100%}.mw-parser-output .navbox-group,.mw-parser-output .navbox-title,.mw-parser-output .navbox-abovebelow{padding:0.25em 1em;line-height:1.5em;text-align:center}.mw-parser-output .navbox-group{white-space:nowrap;text-align:right}.mw-parser-output .navbox,.mw-parser-output .navbox-subgroup{background-color:#fdfdfd}.mw-parser-output .navbox-list{line-height:1.5em;border-color:#fdfdfd}.mw-parser-output .navbox-list-with-group{text-align:left;border-left-width:2px;border-left-style:solid}.mw-parser-output tr+tr>.navbox-abovebelow,.mw-parser-output tr+tr>.navbox-group,.mw-parser-output tr+tr>.navbox-image,.mw-parser-output tr+tr>.navbox-list{border-top:2px solid #fdfdfd}.mw-parser-output .navbox-title{background-color:#ccf}.mw-parser-output .navbox-abovebelow,.mw-parser-output .navbox-group,.mw-parser-output .navbox-subgroup .navbox-title{background-color:#ddf}.mw-parser-output .navbox-subgroup .navbox-group,.mw-parser-output .navbox-subgroup .navbox-abovebelow{background-color:#e6e6ff}.mw-parser-output .navbox-even{background-color:#f7f7f7}.mw-parser-output .navbox-odd{background-color:transparent}.mw-parser-output .navbox .hlist td dl,.mw-parser-output .navbox .hlist td ol,.mw-parser-output .navbox .hlist td ul,.mw-parser-output .navbox td.hlist dl,.mw-parser-output .navbox td.hlist ol,.mw-parser-output .navbox td.hlist ul{padding:0.125em 0}.mw-parser-output .navbox .navbar{display:block;font-size:100%}.mw-parser-output .navbox-title .navbar{float:left;text-align:left;margin-right:0.5em}body.skin--responsive .mw-parser-output .navbox-image img{max-width:none!important}@media print{body.ns-0 .mw-parser-output .navbox{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><style data-mw-deduplicate="TemplateStyles:r886047488">
/* start https://en.wikipedia.org/ */
.mw-parser-output .nobold{font-weight:normal}
/* end https://en.wikipedia.org/ */
</style></div><div role="navigation" class="navbox" aria-labelledby="Pascal_programming_language_family576" style="padding:3px"><table class="nowraplinks hlist mw-collapsible autocollapse navbox-inner" style="border-spacing:0;background:transparent;color:inherit"><tbody><tr><th scope="col" class="navbox-title" colspan="3"><style data-mw-deduplicate="TemplateStyles:r1239400231">
/* start https://en.wikipedia.org/ */
.mw-parser-output .navbar{display:inline;font-size:88%;font-weight:normal}.mw-parser-output .navbar-collapse{float:left;text-align:left}.mw-parser-output .navbar-boxtext{word-spacing:0}.mw-parser-output .navbar ul{display:inline-block;white-space:nowrap;line-height:inherit}.mw-parser-output .navbar-brackets::before{margin-right:-0.125em;content:"[ "}.mw-parser-output .navbar-brackets::after{margin-left:-0.125em;content:" ]"}.mw-parser-output .navbar li{word-spacing:-0.125em}.mw-parser-output .navbar a>span,.mw-parser-output .navbar a>abbr{text-decoration:inherit}.mw-parser-output .navbar-mini abbr{font-variant:small-caps;border-bottom:none;text-decoration:none;cursor:inherit}.mw-parser-output .navbar-ct-full{font-size:114%;margin:0 7em}.mw-parser-output .navbar-ct-mini{font-size:114%;margin:0 4em}html.skin-theme-clientpref-night .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}@media(prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .navbar li a abbr{color:var(--color-base)!important}}@media print{.mw-parser-output .navbar{display:none!important}}
/* end https://en.wikipedia.org/ */
</style><div id="Pascal_programming_language_family576" style="font-size:114%;margin:0 4em"><a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal programming language</a> family</div></th></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Programming_language#Dialects,_flavors_and_implementations" title="Programming language">Dialects</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Pascal_(programming_language)" title="Pascal (programming language)">Pascal</a></li>
<li><a href="Object_Pascal" title="Object Pascal">Object Pascal</a></li>
<li><a href="Pascal_Script" title="Pascal Script">Pascal Script</a></li>
<li><a href="Oxygene_(programming_language)" title="Oxygene (programming language)">Oxygene</a></li>
<li><a href="Clascal" title="Clascal">Clascal</a></li>
<li><a href="Concurrent_Pascal" title="Concurrent Pascal">Concurrent Pascal</a></li>
<li><a href="SuperPascal" title="SuperPascal">SuperPascal</a></li></ul>
</div></td><td class="noviewer navbox-image" rowspan="6" style="width:1px;padding:0 0 0 2px"><div><span typeof="mw:File"></span></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Compiler" title="Compiler">Compilers</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em"></div><table class="nowraplinks navbox-subgroup" style="border-spacing:0"><tbody><tr><th scope="row" class="navbox-group" style="width:1%">Current</th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Delphi_(software)" title="Delphi (software)">Delphi</a> (<a href="History_of_Delphi_(software)" title="History of Delphi (software)">history</a>)</li>
<li><a href="Oxygene_(programming_language)" title="Oxygene (programming language)">Oxygene</a></li>
<li><a href="Pascal_(programming_language)#Compilers_and_interpreters" title="Pascal (programming language)">VSI Pascal</a></li>
<li><a href="IP_Pascal" title="IP Pascal">IP Pascal</a></li>
<li><a href="Free_Pascal" title="Free Pascal">Free Pascal</a> (<a href="Lazarus_(software)" title="Lazarus (software)">Lazarus</a>)</li>
<li><a href="PascalABC.NET" title="PascalABC.NET">PascalABC.NET</a></li>
<li><a href="GNU_Pascal" title="GNU Pascal">GNU Pascal</a></li>
<li><a href="Turbo51" title="Turbo51">Turbo51</a></li>
<li><a href="Pic_Micro_Pascal" title="Pic Micro Pascal">Pic Micro Pascal</a></li>
<li><a href="Amsterdam_Compiler_Kit" title="Amsterdam Compiler Kit">ACK</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Discontinued</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Virtual_Pascal" title="Virtual Pascal">Virtual Pascal</a></li>
<li><a href="Apple_Pascal" title="Apple Pascal">Apple Pascal</a></li>
<li><a href="Borland_Kylix" title="Borland Kylix">Borland Kylix</a></li>
<li><a href="Turbo_Pascal" title="Turbo Pascal">Turbo Pascal</a></li>
<li><a href="Microsoft_Pascal" title="Microsoft Pascal">Microsoft Pascal</a></li>
<li><a href="UCSD_Pascal" title="UCSD Pascal">UCSD Pascal</a></li>
<li><a href="JRT_Pascal" title="JRT Pascal">JRT Pascal</a></li>
<li><a href="Pascal/MT%2B" title="Pascal/MT+">Pascal/MT+</a></li></ul>
</div></td></tr></tbody></table><div></div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="API" title="API">API</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Component_Library_for_Cross_Platform" title="Component Library for Cross Platform">CLX</a></li>
<li><a href="Free_Component_Library" title="Free Component Library">FCL</a></li>
<li><a href="FireMonkey" title="FireMonkey">FireMonkey</a></li>
<li><a href="Lazarus_Component_Library" title="Lazarus Component Library">LCL</a></li>
<li><a href="Object_Windows_Library" title="Object Windows Library">Object Windows Library</a></li>
<li><a href="OpenWire_(library)" title="OpenWire (library)">OpenWire</a></li>
<li><a href="Free_Pascal_Runtime_Library" title="Free Pascal Runtime Library">RTL</a></li>
<li><a href="Turbo_Vision" title="Turbo Vision">Turbo Vision</a></li>
<li><a href="Visual_Component_Library" title="Visual Component Library">Visual Component Library</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Microcomputer" title="Microcomputer">Microcomputer</a></th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Pascal_MicroEngine" title="Pascal MicroEngine">Pascal MicroEngine</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%"><a href="Comparison_of_programming_languages" title="Comparison of programming languages">Comparisons</a></th><td class="navbox-list-with-group navbox-list navbox-even" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Comparison_of_Pascal_and_C" title="Comparison of Pascal and C">Pascal and C</a></li>
<li><a href="Comparison_of_Pascal_and_Delphi" title="Comparison of Pascal and Delphi">Pascal and Delphi</a></li></ul>
</div></td></tr><tr><th scope="row" class="navbox-group" style="width:1%">Designer</th><td class="navbox-list-with-group navbox-list navbox-odd" style="width:100%;padding:0"><div style="padding:0 0.25em">
<ul><li><a href="Niklaus_Wirth" title="Niklaus Wirth">Niklaus Wirth</a></li></ul>
</div></td></tr><tr><td class="navbox-abovebelow" colspan="3"><div>
<ul><li><a href="Generic_programming#Genericity_in_Pascal" title="Generic programming">Genericity</a></li></ul>
<dl><dt><span class="nobold">Related to</span></dt>
<dd><a href="ALGOL" title="ALGOL">ALGOL</a> (1958)</dd>
<dd><a href="Modula-2" title="Modula-2">Modula-2</a> (1977)</dd>
<dd><a href="Ada_(programming_language)" title="Ada (programming language)">Ada</a> (1983)</dd>
<dd><a href="Oberon_(programming_language)" title="Oberon (programming language)">Oberon</a> (1986)</dd>
<dd><a href="Modula-3" title="Modula-3">Modula-3</a> (1988)</dd>
<dd><a href="Oberon-2" title="Oberon-2">Oberon-2</a> (1991)</dd>
<dd><a href="Component_Pascal" title="Component Pascal">Component Pascal</a> (1991)</dd></dl>
</div></td></tr></tbody></table></div></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-26" href="https://en.wikipedia.org/wiki/?title=Joyce_(programming_language)&oldid=1292421027">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
</body></html>